import router from '@/router/index';
import routes from '@/router/routes';

/**
 * 遍历路由生成菜单列表
 * @param [Array] targetArr 目标数组
 * @param [Array] arr 需要查询的数组
 * @param [Array] item 判断是否有子集
 * @param [Array] access 入口权限名需为数组，如 ['superAdmin', 'admin']
 * @description  1.判断要查询的数组是否至少有一个元素包含在目标数组中
 *               2.判断有无子集
 *               3.根据access入口名判断路由菜单是否显示,遍历所有可见路由列表
 *               4.通过路由列表得到菜单列表
 */
// 路由权限列表 targetArr  arr 角色携带权限数组集合
// export const hasOneOf = (targetArr, arr) => targetArr.some(its => arr.some(item => item.value === its));
export const hasOneOf = (targetArr, arr) => targetArr.some(its => arr.indexOf(its) > -1);
export const hasChild = item => item.children && item.children.length !== 0;
export const showThisMenuEle = (item, access) => {
    if (item.meta && item.meta.access && item.meta.access.length) {
        if (hasOneOf(item.meta.access, access)) return true;
        return false;
    } return true;
};
export const forEach = (arr, fn) => {
    if (!arr.length || !fn) return;
    let i = -1;
    const len = arr.length;
    while (++i < len) {
        const item = arr[i];
        fn(item, i, arr);
    }
};
export const menuRouter = (list, access) => {
    const res = [];
    forEach(list, (item) => {
        if (!item.meta || (item.meta && !item.meta.hideInMenu)) {
            const obj = {
                icon: (item.meta && item.meta.icon) || '',
                name: item.name,
                meta: item.meta,
            };
            if (hasChild(item) && showThisMenuEle(item, access)) {
                obj.children = menuRouter(item.children, access);
            }
            if (item.meta && item.meta.href) obj.href = item.meta.href;
            if (showThisMenuEle(item, access)) res.push(obj);
        }
    });
    return res;
};


/**
 * 权鉴
 * @param [Array] access 用户入口权限数组，如 ['superAdmin', 'admin']
 * @param {string} name 即将跳转的路由name
 * @param [Array] route 路由列表
 * @description 用户是否可跳转到该页
 */
const hasAccess = (access, route) => {
    // if (route.meta && route.meta.access) return hasOneOf(route.meta.access, access);
    if (route.meta && route.meta.access) return hasOneOf(access, route.meta.access);
    return true;
};
export const canTurnTo = (name, access, route) => {
    const routePermission = list => list.some(item => {
        if (item.children && item.children.length) {
            return routePermission(item.children);
        } if (item.name === name) {
            return hasAccess(access, item);
        }
    });
    return routePermission(route);
};
export const turnTo = (to, access, next) => {
    if (canTurnTo(to.name, access, routes)) next(); // 有权限，可访问(要跳转路由，携带权限数组集合，路由表)
    else next({ name: 'error_401' }); // 无权限，重定向到401页面
};
